package com.star.common.core.contract.exception;

import com.star.common.core.contract.enums.IEnum;
import com.star.common.core.contract.enums.ResultCodeEnum;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * 业务告警异常，分级别处理
 *
 * @author zhouhengzhe
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class ServiceErrorException extends RuntimeException {
    /**
     * 错误码
     */
    protected Integer errCode;
    /**
     * 错误消息
     */
    protected String msg;
    /**
     * 参数
     */
    protected String[] params;
    /**
     * 枚举
     */
    protected IEnum<Integer> iEnum;
    /**
     * 错误的情况下的返回值
     */
    protected Object data;

    /**
     * 默认的国际化异常
     */
    public ServiceErrorException() {
        this(ResultCodeEnum.FAIL.getCode(), ResultCodeEnum.FAIL.getDesc());
        this.errCode = ResultCodeEnum.FAIL.getCode();
        this.msg = ResultCodeEnum.FAIL.getDesc();
    }

    /**
     * 自定义国际化，也就是说message是国际化后的消息
     *
     * @param code   错误码
     * @param msg    国际化后的消息
     * @param params 国际化参数
     * @param e      异常
     */
    public ServiceErrorException(Integer code, String msg, String[] params, Throwable e) {
        this(code, msg, e);
        this.errCode = code;
        this.msg = msg;
        this.params = params;
    }

    /**
     * 自定义国际化，也就是说message是国际化后的消息
     *
     * @param code 错误码
     * @param msg  国际化后的消息
     */
    public ServiceErrorException(Integer code, String msg, Object data) {
        this(code, msg);
        this.errCode = code;
        this.msg = msg;
        this.data = data;
    }

    /**
     * 抛出配置中的国际化异常（i18配置文件下的）
     *
     * @param iEnum 错误码枚举类
     */
    public ServiceErrorException(IEnum<Integer> iEnum) {
        this(iEnum.getCode(), iEnum.getDesc());
        this.iEnum = iEnum;
    }

    /**
     * 抛出配置中的国际化异常（i18配置文件下的）
     *
     * @param iEnum  错误码
     * @param params 国际化参数
     */
    public ServiceErrorException(IEnum<Integer> iEnum, String[] params) {
        this(iEnum.getCode(), iEnum.getDesc());
        this.params = params;
        this.iEnum = iEnum;
    }

    /**
     * 自定义国际化，也就是说message是国际化后的消息
     *
     * @param errCode 错误码
     * @param msg     国际化后的消息
     */
    public ServiceErrorException(Integer errCode, String msg) {
        super(msg);
        this.errCode = errCode;
        this.msg = msg;
    }

    /**
     * 自定义国际化，也就是说message是国际化后的消息
     *
     * @param errCode 错误码
     * @param msg     国际化后的消息
     * @param cause   异常
     */
    public ServiceErrorException(Integer errCode, String msg, Throwable cause) {
        super(msg, cause);
        this.errCode = errCode;
        this.msg = msg;
    }

    public ServiceErrorException(String msg, Throwable e) {
        super(e);
        this.msg = msg;
    }
}
